// 第二步 引入 superagent 包， 用于服务器发送http 请求！
const superagent = require('superagent');
// 引入 cheerio 的 包 用于解析HTML 代码！
const cheerio = require('cheerio');
// 导入模板引擎！
var template = require('art-template');
// 导入系统路径模块 - path 
const path = require('path');
// 导入 发送邮件的模块！
const nodemailer = require("nodemailer");
// 导入 定时任务的包！
var schedule = require('node-schedule');


// 第一步  计算和成鑫认识的天数！
function getEncountedDays() {

    return new Promise((resolve, reject) => {
        // 获取现在的时间
        const today = new Date();
        // 获取第一次见面的时间 2019-03-01
        const meet = new Date('2015-09-09')


        // 计算认识的天数天数
        // 这儿有一个注意的地方 就是你如果要用 Math函数来取整的话
        // floor 是向下取整 如 3.1 就是 3 ceil 是向上取整 如： 3.1 就是4！
        // const days = ((today - meet) / 1000 / 60 / 60 / 24);
        // console.log(parseInt(days) + '天');
        // 这两种方法都可以！
        const days = Math.ceil((today - meet) / 1000 / 60 / 60 / 24);
        // console.log(days + '天');

        // 获取格式化后的时间
        const format = today.getFullYear() + ' / ' + (today.getMonth() + 1) + ' / ' + today.getDate();
        const dayData = {
                today,
                meet,
                format,
                days
            }
            // console.log(dayData); // 获取具体过去的时间到现在时间的毫秒数！！
        resolve(dayData);
    })

}


// 请求墨迹天气 获取数据！
function getMoJiWeather() {
    return new Promise((resolve, reject) => {
        // 为什么会出现请求不了 吾爱破解 的 情况！ 百思不得姐！
        // 还有 你的注意一下， 就是 get 前面的变量名 就是你引入的包的名字的偶！
        superagent.get('https://tianqi.moji.com/weather/china/chongqing/yubei-district').end((err, res) => {
            if (err) return console.log('数据请求失败， 请检查你的路径！');
            // 打印请求成功的信息！
            // console.log(res)
            // console.log(res.text)
            // 如你所见， 单引号中的东东 可以是纯的HTML 结构!
            // 把字符串解析成 HTML
            const $2 = cheerio.load(res.text)
                // 现在 请注意 $2 已经变成了 当前 结构的顶级对象了！ 可以联想jQuery
                // 编程顶级对象之后 就可以使用 jQuery的一些 选择器了！!
                // $2.html() 这玩意儿的作用是 把当前获取到的 对象 以 html 文档呈现！
                // console.log($2.html())
                // 抓取温度！
            const temperature = $2('.wea_weather em').text();
            // console.log('今天的温度是' + temperature + '摄氏度');
            // console.log('抓取温度成功！');
            // 抓取 图标 本质是 拿到 图片的链接！
            console.log('---------------------------------')

            const icon = $2('.wea_weather span img').attr('src');
            // console.log(icon);
            // console.log('抓取图标成功')

            console.log('---------------------------------')
                // 抓取天气
            const weather = $2('.wea_weather b').text();
            // console.log(weather)
            // console.log('抓取天气成功！')
            console.log('---------------------------------')
                // 抓取天气的温馨提示
            const weather_tips = $2('.wea_tips em').text();
            // console.log(weather_tips);
            // console.log('抓取天气的温馨提示成功！')

            const MoJiData = {
                    temperature,
                    icon,
                    weather,
                    weather_tips
                }
                // console.log(MoJiData)
            resolve(MoJiData);
        })
    })
}



// 抓取 one网站的 背景图 和 诗意文字！
function getBgAndPoem_text() {
    return new Promise((resolve, reject) => {
        superagent.get('http://www.wufazhuce.com/').end((err, res) => {
            if (err) return console.log('数据请求失败，请检查你的路径或者者对方网站开启了反爬虫机制！')
            const $3 = cheerio.load(res.text);
            // 抓取 one  的 图片！
            const img = $3('.carousel-inner>.item>img, .carousel-inner>.item>a>img').eq(0).attr('src');
            // 抓取 one 的 文本！
            var text1 = $3('.fp-one .fp-one-cita-wrapper .fp-one-cita a').text();
            const oneData = {
                    img,
                    text1
                }
                // console.log(oneData)
            resolve(oneData);
        })
    })
}


// 通过模板引擎替换我们的HTML的数据
async function renderByArtTemplate() {
    // 获取 日期
    // 调用 相遇时间的函数
    const renshishijian = await getEncountedDays();

    // 获取 墨迹天气数据
    // 调用 获取天气的函数
    const rmoJiData = await getMoJiWeather();

    // 获取 One 的数r据
    // 调用 One 网站的数据
    // await 等待 等待上衣个异步函数执行完了之后就可以 执行这个了 完全按照 你写 await 的顺序执行的！
    const oneData = await getBgAndPoem_text();

    // console.log(renshishijian)
    // console.log(rmoJiData)
    // console.log(oneData)
    // 所有数据都获取成功的时候， 才进行模板引擎数据的替换！
    // 第一步 ， 先把html 页面先加载过来！
    return new Promise((resolve, reject) => {
        const html = template(path.join(__dirname, './lvchengxin.html'), {
                test: '测试！',
                renshishijian,
                rmoJiData,
                oneData
            })
            // console.log(html);
        resolve(html);
    })


    // console.log(template(path.join(__dirname), 'lvchengxin.html'))
    // console.log(path.join(__dirname, './lvchengxin.html')); // D:\myProfessionalProfiles\QDSJK\Node\node-crawler ./lvchengxin.html
}

// 发送邮件函数！
async function sendNodeMail() {
    // html 页面内容 通过 await 等待 模板引擎渲染完毕后， 再往下执行代码!
    const html = await renderByArtTemplate();
    console.log(html)
        // 使用默认的SMTP 传输 ， 创建可重用的邮箱对象
    let transporter = nodemailer.createTransport({
            host: 'smtp.163.com',
            port: 465,
            secure: true, // 开启加密协议， 需要用到 465 端口号
            auth: {
                user: '15523352161@163.com',
                pass: 'ULFEDERGTQOKRUHN' // 客户端授权密码！
            }

        })
        // 设置电子邮件数据
    let mailOptions = {
        from: "'深圳前端', <15523352161@163.com>", // 发件人的邮箱
        to: '15310904664@163.com', // 收件人列表
        subject: '测试邮件 来自吕航 1', // 标题
        html: html // html 你发送的内容
    }
    transporter.sendMail(mailOptions, (error, info = {}) => {
        if (error) {
            console.log(error);
            sendNodeMail(); // 再次发送！
        }
        // info.messageId
        console.log('邮件发送成功！', info.messageId);
        console.log('静等下一次发送')
    });

}

// 定时每天 5：20：14 发送邮件给成鑫！
// 创建定时任务！
var j = schedule.scheduleJob('5000 * * * * *', function() {
    sendNodeMail();
    console.log('定时任务-发送邮件成功！');
});